home *** CD-ROM | disk | FTP | other *** search
/ Atari Forever 4 / Atari Forever 4.zip / Atari Forever 4.iso / PD_THEMA / CPX / GEMSOUND / SOURCE / GEMSOUND.C < prev    next >
C/C++ Source or Header  |  1998-03-14  |  5KB  |  189 lines

  1. /*  GEMSOUND.C
  2.  *  Main-Teil
  3.  *
  4.  *  aus: GEM Sound
  5.  *       TOS Magazin
  6.  *
  7.  *  (c)1992 by Richard Kurz
  8.  *  Vogelherdbogen 62
  9.  *  7992 Tettnang
  10.  *  Fido 2:241/7232
  11.  *
  12.  *  Erstellt mit Pure C
  13.  */
  14.  
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <string.h>
  18. #include <tos.h>
  19. #include <screen.h>
  20. #include "sounds.h"
  21.  
  22. /* Prototypen aus dem Assemblerteil             */
  23. long set_gem(void);
  24. long set_click(void);
  25. void start_sound(char *a,char *e,int reset);
  26.  
  27. /* Prototypen für die Cookieverwaltung          */
  28. int get_cookie(unsigned long cookie,unsigned long *value);
  29. int make_cookie(unsigned long cookie,unsigned long value);
  30.  
  31. /* globale Variablen                            */
  32. C_SOUNDS si;        /* Struktur für den Austausch mit dem CPX-Modul */
  33. int error=FALSE;    /* Fehler-Flag */
  34.  
  35. void play_it(SINF *sound,int super)
  36. /* Spielt einen Sound */
  37. {
  38.     long stack;
  39.  
  40.     if(super) stack=Super(0L);
  41.     start_sound((char *)(sound->anfang),(char *)((char *)(sound->anfang)+sound->laenge),si.r_flag);
  42.     if(super)Super((void *)stack);
  43.     return;
  44. } /* play_it */
  45.  
  46. int do_it(int d)
  47. /* sucht den Sound zu einem AES-Aufruf und spielt ihn ab */
  48. {
  49.     int i;
  50.     
  51.     if(si.ruhe) return(TRUE);
  52.     
  53.     for(i=0;i<MAX_SAMP;i++)
  54.     {
  55.         if(si.gem_inf[i].nr==d)
  56.         {
  57.             if(si.gem_inf[i].an)
  58.             {
  59.                 play_it(&si.sounds[si.gem_inf[i].sound],FALSE);
  60.                 return(FALSE);
  61.             }
  62.             break;
  63.         }
  64.     }
  65.     return(TRUE);
  66. } /* do_it */
  67.  
  68. int load_smp(char *pfad, int nr)
  69. /* Ein Sample wird geladen  */
  70. {
  71.     long len;
  72.     int fp;
  73.     static char puffer[350];
  74.  
  75.     fp = Fopen(pfad,0);
  76.     if(fp<0) return(-1);                     
  77.     Fread(fp,4L,puffer);                   
  78.     if(*((long*)puffer)!=0x7E817E81L)
  79.     {
  80.         Fclose(fp);
  81.         return(-2);
  82.     }
  83.     Fread(fp,4L,&puffer[4]);
  84.     len=(long)(*((int*)&puffer[4]) + *((int*)&puffer[6]));
  85.     Fread(fp,len,&puffer[8]);
  86.     si.sounds[nr].laenge=len= *((long*) &puffer[8]);
  87.     si.sounds[nr].anfang=(long *)malloc(len);
  88.     if(si.sounds[nr].anfang==NULL)
  89.     {
  90.         Fclose(fp);
  91.         return(-3);
  92.     }
  93.     Fread(fp,len,si.sounds[nr].anfang);
  94.     Fclose(fp);
  95.     return(FALSE);
  96. } /* load_smp */
  97.  
  98. int main(void)
  99. /* Nu geht's awer los   */
  100. {
  101.     DTA dt,*dto;
  102.     int i,g;
  103.     unsigned long cok;
  104.     char  s[255],*c;
  105.     C_SOUNDS *nsi;
  106.     
  107.     Clear_home();
  108.     Rev_on();
  109.     puts("      GEM Sound V1.0     ");
  110.     puts("                         ");
  111.     puts(" (c)1992 by Richard Kurz ");
  112.     puts(" Vogelherdbogen 62       ");
  113.     puts(" 7992 Tettnang           ");
  114.     puts(" Fido 2:241/7232         ");
  115.     puts("                         ");
  116.     puts(" Für's TOS Magazin!!!!   ");
  117.     Rev_off();
  118.     puts("");
  119.     
  120.     /* Test auf DMA-SOUND */    
  121.     if(!get_cookie('_SND',&cok) || !(cok&2))
  122.     {
  123.         puts("FEHLER:");
  124.         puts("GEM Sound läuft leider nur mit DMA-Sound (STE/TT)");
  125.         puts("\n<RETURN>");
  126.         getchar();
  127.         return(1);
  128.     }
  129.     /* Sind wir schon installiert? */
  130.     if(get_cookie('GSND',(unsigned long*)(&nsi)))
  131.     {
  132.         puts("FEHLER:");
  133.         puts("Bin schon da");
  134.         puts("\n<RETURN>");
  135.         getchar();
  136.         return(1);
  137.     }
  138.     
  139.     /* Die Samples werden geladen */
  140.     dto=Fgetdta();
  141.     Fsetdta(&dt);
  142.     g=Fsfirst("samples\\*.smp",FA_READONLY|FA_ARCHIVE);
  143.     for(i=0;!g && i<MAX_SAMP;i++)
  144.     {
  145.         strcpy(s,"samples\\");
  146.         strcat(s,dt.d_fname);
  147.         strcpy(si.sounds[i].name,dt.d_fname);
  148.         c=strchr(si.sounds[i].name,'.');
  149.         if(c) *c=0;
  150.          puts(s);
  151.            error=load_smp(s,i);
  152.         if(error) break;
  153.         g=Fsnext();
  154.     }
  155.     if(!error) si.max_sound=i;
  156.     else si.max_sound=0;
  157.     Fsetdta(dto);
  158.  
  159.     /* Wir richten uns ein */
  160.     if(!error && si.max_sound<=0) error=-4;
  161.     if(error)
  162.     {
  163.         puts("FEHLER:");
  164.         switch (error)
  165.         {
  166.             case -1: puts("Datei nicht gefunden"); break;
  167.             case -2: puts("Kein SampleWizard-Format"); break;
  168.             case -3: puts("Nicht genug Speicher frei"); break;
  169.             default: puts("Samples konnten nicht geladen werden"); break;
  170.         }
  171.         puts("\n<RETURN>");
  172.         getchar();
  173.         return(1);
  174.     }
  175.     si.fix=FALSE;
  176.     si.play=play_it;
  177.     si.set_vec=set_gem;
  178.     if(make_cookie('GSND',(unsigned long)&si))
  179.     {
  180.         Supexec(set_click);
  181.         Ptermres(_PgmSize,0);
  182.     }
  183.     puts("FEHLER:");
  184.     puts("Das Cookie GSND konnte nicht angelegt werden");
  185.     puts("\n<RETURN>");
  186.     getchar();
  187.     return(1);
  188. } /* main */
  189.